home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / kcl.lha / ustation / mkhtab.c < prev    next >
C/C++ Source or Header  |  1986-01-17  |  2KB  |  123 lines

  1. #include <stdio.h>
  2.  
  3. char buffer0[1024], buffer1[1024], prefix[6];
  4.  
  5. struct htab {
  6.     char *h_key;
  7.     char *h_val;
  8. } *htab;
  9. int htabsiz, htabnent;
  10.  
  11. main(argc, argv)
  12. int argc;
  13. char **argv;
  14. {
  15.     register count, i;
  16.     char *k, *v;
  17.     extern char *malloc();
  18.  
  19.     if (argc < 2) {
  20.         printf("Arg count.\n");
  21.         exit(1);
  22.     }
  23.     htabsiz = atoi(argv[1]);
  24.     htab = (struct htab *)malloc(sizeof(struct htab) * htabsiz);
  25.     for (i = 0;  i < htabsiz;  i++)
  26.         htab[i].h_key = NULL;
  27.  
  28. START:
  29.     readline(buffer0);
  30. L:
  31.     readline(buffer1);
  32.     if (strncmp(buffer0, buffer1, 7) != 0) {
  33.         strcpy(buffer0, buffer1);
  34.         goto L;
  35.     }
  36.     if (strncmp(prefix, buffer0, 5) != 0) {
  37.         count = 0;
  38.         strncpy(prefix, buffer0, 5);
  39.     }
  40.     if (argc >= 3) {
  41.         printf("%s\n", buffer1);
  42.         fflush(stdout);
  43.     }
  44.     k = malloc(strlen(buffer0) + 1);
  45.     v = malloc(strlen(buffer0) + 3);
  46.     strcpy(k, buffer0);
  47.     if (++count >= 10*26) {
  48.         fprintf(stderr, "Too many similar identifiers.\n");
  49.         exit(1);
  50.     }
  51.     sprintf(v, "%s%c%c%s",
  52.         prefix, '0'+count%10, 'A'+count/10, buffer0+5);
  53.     enter(k, v);
  54. LL:
  55.     if (argc >= 3) {
  56.         printf("%s\n", buffer1);
  57.         fflush(stdout);
  58.     }
  59.     k = malloc(strlen(buffer1) + 1);
  60.     v = malloc(strlen(buffer1) + 3);
  61.     strcpy(k, buffer1);
  62.     if (++count >= 10*26) {
  63.         fprintf(stderr, "Too many similar identifiers.\n");
  64.         exit(1);
  65.     }
  66.     sprintf(v, "%s%c%c%s",
  67.         prefix, '0'+count%10, 'A'+count/10, buffer1+5);
  68.     enter(k, v);
  69.     readline(buffer1);
  70.     if (strncmp(buffer0, buffer1, 7) != 0) {
  71.         strcpy(buffer0, buffer1);
  72.         goto L;
  73.     }
  74.     goto LL;
  75. }
  76.  
  77. readline(s)
  78. char *s;
  79. {
  80.     register i, c;
  81.  
  82.     c = getchar();
  83.     if (feof(stdin))
  84.         output();
  85.     for (i = 0;  c != '\n';  i++, c = getchar())
  86.         s[i] = c;
  87.     s[i] = '\0';
  88. }
  89.  
  90. #include "hash.c"
  91.  
  92. enter(k, v)
  93. char *k, *v;
  94. {
  95.     int s;
  96.  
  97.     if (htabnent++ > htabsiz/2) {
  98.         fprintf(stderr, "Htab overflow.\n");
  99.         exit(1);
  100.     }
  101.     s = hash(k, htabsiz);
  102.     while (htab[s].h_key != NULL)
  103.         s = (s+1)%htabsiz;
  104.     htab[s].h_key = k;
  105.     htab[s].h_val = v;
  106. }
  107.  
  108. output()
  109. {
  110.     register i;
  111.  
  112.     i = 0;
  113.     printf("/*  %d entries  */\n", htabnent);
  114.     printf("struct htab {\n\tchar *h_key;\n\tchar *h_val;\n} htab[%d] = {\n", htabsiz);
  115.     for (i = 0;  i < htabsiz;  i++)
  116.         if (htab[i].h_key != NULL)
  117.             printf("\t{\"%s\", \"%s\"},\n", htab[i].h_key, htab[i].h_val);
  118.         else
  119.             printf("\t{0, 0},\n");
  120.     printf("};\n");
  121.     exit(0);
  122. }
  123.